package org.soderiakelvy.model.dao.imp;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;


import org.hibernate.Criteria;
import org.hibernate.SessionFactory;
import org.hibernate.classic.Session;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;
import org.soderiakelvy.model.dao.ProductoDao;
import org.soderiakelvy.model.domain.ProductoVO;
import org.soderiakelvy.model.domain.TipoProductoVO;
import org.soderiakelvy.model.util.HibernateUtil;

public class ProductoDaoImp implements ProductoDao, Serializable {
	private static final long serialVersionUID = -3022482123607849188L;

	@Override
	public void insertProductoVO(ProductoVO producto) throws Exception {
		SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        session.save(producto);
        session.getTransaction().commit();
        session.close();
		
	}

	@Override
	public void updateProductoVO(ProductoVO producto) throws Exception {
		SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        session.update(producto);
        session.getTransaction().commit();
        session.close();
		
	}

	@Override
	public void deleteProductoVO(ProductoVO producto) throws Exception {
		SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
        Session session = sessionFactory.openSession();
        session.beginTransaction();
        session.delete(producto);
        session.getTransaction().commit();
        session.close();
		
	}

	@Override
	public ProductoVO getProductoVOById(long id) throws Exception {
		SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
        Session session = sessionFactory.openSession();
        Criteria criteria = session.createCriteria(ProductoVO.class);
        criteria.add(Restrictions.eq("productoId", id)).uniqueResult();
        ProductoVO pVO = (ProductoVO) criteria.uniqueResult();
        session.close();
        return pVO;
	}

	@Override
	public List<ProductoVO> getProductosPorTipo(TipoProductoVO tipoProducto) {
		try {
			SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
	        Session session = sessionFactory.openSession();
	        Criteria criteria = session.createCriteria(ProductoVO.class);
	        criteria.add(Restrictions.eq("tipoProducto", tipoProducto));
	        criteria.addOrder(Order.asc("nombre"));
	        List<ProductoVO> productos = criteria.list();
	        session.close();
	        return productos;
		} catch (Exception e) {
			e.printStackTrace();
			return new ArrayList<ProductoVO>();
		}
		
	}

	@Override
	public List<ProductoVO> getAllProductoVO() throws Exception {
		SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
        Session session = sessionFactory.openSession();
        Criteria criteria = session.createCriteria(ProductoVO.class);
        criteria.addOrder(Order.asc("productoId"));
        List<ProductoVO> productos = criteria.list();
        session.close();
	        return productos;
	}

	@Override
	public ProductoVO getProductoByNombre(String nombre) {
		try {
			SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
	        Session session = sessionFactory.openSession();
	        Criteria criteria = session.createCriteria(ProductoVO.class);
	        criteria.add(Restrictions.eq("nombre", nombre));
	        ProductoVO p = (ProductoVO)criteria.uniqueResult();
	        session.close();
	        return p;
		} catch (Exception e) {
			e.printStackTrace();
			return new ProductoVO();
		}
	}

}
